package top.fsb.dataview.service.service.impl;

import ch.qos.logback.core.joran.util.beans.BeanUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import top.fsb.dataview.service.entity.BaseEntity;
import top.fsb.dataview.service.entity.BladeUser;
import top.fsb.dataview.service.service.BaseService;

import javax.validation.constraints.NotEmpty;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

@Validated
public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseEntity> extends ServiceImpl<M, T> implements BaseService<T> {
    public BaseServiceImpl() {
    }

    public boolean save(T entity) {
        this.resolveEntity(entity);
        return super.save(entity);
    }

    public boolean saveBatch(Collection<T> entityList, int batchSize) {
        entityList.forEach(this::resolveEntity);
        return super.saveBatch(entityList, batchSize);
    }

    public boolean updateById(T entity) {
        this.resolveEntity(entity);
        return super.updateById(entity);
    }

    public boolean updateBatchById(Collection<T> entityList, int batchSize) {
        entityList.forEach(this::resolveEntity);
        return super.updateBatchById(entityList, batchSize);
    }

    public boolean saveOrUpdate(T entity) {
        return entity.getId() == null ? this.save(entity) : this.updateById(entity);
    }

    public boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize) {
        entityList.forEach(this::resolveEntity);
        return super.saveOrUpdateBatch(entityList, batchSize);
    }

    @Transactional(
            rollbackFor = {Exception.class}
    )
    public boolean deleteLogic(@NotEmpty List<Long> ids) {
//        BladeUser user = AuthUtil.getUser();
//        List<T> list = new ArrayList();
//        ids.forEach((id) -> {
//            T entity = (BaseEntity) BeanUtil.newInstance(this.currentModelClass());
//            if (user != null) {
//                entity.setUpdateUser(user.getUserId());
//            }
//
//            entity.setUpdateTime(new Date());
//            entity.setId(id);
//            list.add(entity);
//        });
//        super.updateBatchById(list) &&
        return  super.removeByIds(ids);
    }

    public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
//        BladeUser user = AuthUtil.getUser();
        List<T> list = new ArrayList();
//        ids.forEach((id) -> {
//            T entity = (BaseEntity)BeanUtil.newInstance(this.currentModelClass());
//            if (user != null) {
//                entity.setUpdateUser(user.getUserId());
//            }
//
//            entity.setUpdateTime(new Date());
//            entity.setId(id);
//            entity.setStatus(status);
//            list.add(entity);
//        });
        return super.updateBatchById(list);
    }

    private void resolveEntity(T entity) {
//        try {
//            BladeUser user = AuthUtil.getUser();
//            Date now = new Date();
//            if (entity.getId() == null) {
//                if (user != null) {
//                    entity.setCreateUser(user.getUserId());
//                    entity.setCreateDept(Func.firstLong(user.getDeptId()));
//                    entity.setUpdateUser(user.getUserId());
//                }
//
//                if (entity.getStatus() == null) {
//                    entity.setStatus(1);
//                }
//
//                entity.setCreateTime(now);
//            } else if (user != null) {
//                entity.setUpdateUser(user.getUserId());
//            }
//
//            entity.setUpdateTime(now);
//            entity.setIsDeleted(0);
//            Field field = ReflectUtil.getField(entity.getClass(), "tenantId");
//            if (ObjectUtil.isNotEmpty(field)) {
//                Method getTenantId = ClassUtil.getMethod(entity.getClass(), "getTenantId", new Class[0]);
//                String tenantId = String.valueOf(getTenantId.invoke(entity));
//                if (ObjectUtil.isEmpty(tenantId)) {
//                    Method setTenantId = ClassUtil.getMethod(entity.getClass(), "setTenantId", new Class[]{String.class});
//                    setTenantId.invoke(entity, null);
//                }
//            }
//
//        } catch (Throwable var8) {
//            throw var8;
//        }
    }
}
